﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using PortalBusiness.Models;

namespace PortalBusiness.Controllers
{
    [Authorize]
    public class TITULOSController : Controller
    {
        private PortalBusinessContext db = new PortalBusinessContext();

        // GET: TITULOS
        public ActionResult Index()
        {
            USUARIO usuario = db.USUARIOs.Where(u => u.LOGIN == User.Identity.Name).FirstOrDefault();
            List<TITULO> titulos = db.TITULOes.Where(t => t.CODIGO_LOJA == usuario.CODIGO_LOJA && t.CODIGO_NEGOCIO == usuario.CODIGO_NEGOCIO).OrderByDescending(t => t.TITULOID).ToList();
            foreach (TITULO item in titulos)
            {
                NATUREZASTART natureza = db.NATUREZAs.Where(n => n.CODIGO == item.DOC_NATUREZA).FirstOrDefault();
                if (natureza != null)
                    item.DESCRICAO_NATUREZA = natureza.DESCRICAO;

                FORNECEDOR fornecedor = db.FORNECEDORs.Where(f => f.CODIGO == item.FORNECEDOR).FirstOrDefault();
                if (fornecedor != null)
                    item.DESCRICAO_FORNECEDOR = fornecedor.NOME;

            }
            return View(titulos);
        }

        // GET: TITULOS/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            TITULO tITULO = db.TITULOes.Find(id);
            if (tITULO == null)
            {
                return HttpNotFound();
            }
            return View(tITULO);
        }



        // GET: TITULOS/Create
        public ActionResult Create()
        {
            List<SelectListItem> tipo = new List<SelectListItem>();
            tipo.Add(new SelectListItem() { Text = "Sangria", Value = "1" });
            tipo.Add(new SelectListItem() { Text = "Título a pagar", Value = "2" });
            ViewBag.DOC_TIPO = tipo;

            List<NATUREZA> DOC_NATUREZA = db.Database.SqlQuery<NATUREZA>(System.Configuration.ConfigurationManager.AppSettings["QUERY_NATUREZA"]).ToList();
            ViewBag.DOC_NATUREZA = new SelectList(DOC_NATUREZA,"CODIGO","DESCRICAO");
            ViewBag.FORNECEDOR = new SelectList(db.FORNECEDORs.Where(f => f.ATIVO == true).ToList(), "CODIGO", "NOME");
            
            return View();
        }

        // POST: TITULOS/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "TITULOID,CODIGO_NEGOCIO,CODIGO_LOJA,DATA_PROCESSAMENTO,HORA_PROCESSAMENTO,LOGIN,DOC_TIPO,DOC_EMISSAO,DOC_VENCIMENTO,DOC_HISTORICO,DOC_VALOR,DOC_NUMERO,DOC_NATUREZA,STATUS,FORNECEDOR")] TITULO tITULO)
        {

            if (tITULO.DOC_TIPO ==2)
            {
                tITULO.DOC_NATUREZA = db.FORNECEDORs.Where(f => f.CODIGO == tITULO.FORNECEDOR).FirstOrDefault().NATUREZA;
                if (tITULO.DOC_NATUREZA == null)
                    tITULO.DOC_NATUREZA = "?";
            }

            USUARIO usuario = db.USUARIOs.Where(u => u.LOGIN == User.Identity.Name).FirstOrDefault();

            tITULO.CODIGO_LOJA = usuario.CODIGO_LOJA;
            tITULO.CODIGO_NEGOCIO = usuario.CODIGO_NEGOCIO;


            if (db.TITULOes.Where(t => t.CODIGO_LOJA == tITULO.CODIGO_LOJA && t.CODIGO_NEGOCIO == tITULO.CODIGO_NEGOCIO && t.FORNECEDOR == tITULO.FORNECEDOR && t.DOC_NUMERO == tITULO.DOC_NUMERO).Count() > 0)
                ModelState.AddModelError("DOC_NUMERO", "Este número já está sendo utilizado por este fornecedor!");


            if (ModelState.IsValid)
            {
                tITULO.DATA_PROCESSAMENTO = DateTime.Today;
                tITULO.HORA_PROCESSAMENTO = DateTime.Now.ToString("HH:mm:ss");
                tITULO.LOGIN = usuario.LOGIN;
                tITULO.STATUS = 0;

                db.TITULOes.Add(tITULO);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            List<SelectListItem> tipo = new List<SelectListItem>();
            tipo.Add(new SelectListItem() { Text = "Sangria", Value = "1" });
            tipo.Add(new SelectListItem() { Text = "Título a pagar", Value = "2" });

            List<NATUREZA> DOC_NATUREZA = db.Database.SqlQuery<NATUREZA>(System.Configuration.ConfigurationManager.AppSettings["QUERY_NATUREZA"]).ToList();
            ViewBag.DOC_NATUREZA = new SelectList(DOC_NATUREZA, "CODIGO", "DESCRICAO");
            ViewBag.FORNECEDOR = new SelectList(db.FORNECEDORs.Where(f => f.ATIVO == true).ToList(), "CODIGO", "NOME", tITULO.FORNECEDOR);

            ViewBag.DOC_TIPO = tipo;

            return View(tITULO);
        }

        // GET: TITULOS/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            TITULO tITULO = db.TITULOes.Find(id);

            if (tITULO.LOGIN == null || !tITULO.LOGIN.Equals(User.Identity.Name) || !tITULO.STATUS.Equals(0))
            {
                return RedirectToAction("Index");
            }

            List<SelectListItem> tipo = new List<SelectListItem>();
            tipo.Add(new SelectListItem() { Text = "Sangria", Value = "1" });
            tipo.Add(new SelectListItem() { Text = "Título a pagar", Value = "2", Selected = (tITULO.DOC_TIPO == 2) });

            ViewBag.DOC_TIPO = tipo;

            List<NATUREZA> DOC_NATUREZA = db.Database.SqlQuery<NATUREZA>(System.Configuration.ConfigurationManager.AppSettings["QUERY_NATUREZA"]).ToList();
            ViewBag.DOC_NATUREZA = new SelectList(DOC_NATUREZA, "CODIGO", "DESCRICAO",tITULO.DOC_NATUREZA);
            ViewBag.FORNECEDOR = new SelectList(db.FORNECEDORs.Where(f => f.ATIVO == true).ToList(), "CODIGO", "NOME", tITULO.FORNECEDOR);
            
            return View(tITULO);
        }

        // POST: TITULOS/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "TITULOID,CODIGO_NEGOCIO,CODIGO_LOJA,DATA_PROCESSAMENTO,HORA_PROCESSAMENTO,LOGIN,DOC_TIPO,DOC_EMISSAO,DOC_VENCIMENTO,DOC_HISTORICO,DOC_VALOR,DOC_NUMERO,DOC_NATUREZA,STATUS,FORNECEDOR")] TITULO tITULO)
        {
            if (tITULO.DOC_TIPO == 2)
            {
                tITULO.DOC_NATUREZA = db.FORNECEDORs.Where(f => f.CODIGO == tITULO.FORNECEDOR).FirstOrDefault().NATUREZA;
                if (tITULO.DOC_NATUREZA == null)
                    tITULO.DOC_NATUREZA = "?";
            }

            if  (db.TITULOes.Where(t => t.CODIGO_LOJA == tITULO.CODIGO_LOJA && t.CODIGO_NEGOCIO == tITULO.CODIGO_NEGOCIO && t.FORNECEDOR == tITULO.FORNECEDOR && t.DOC_NUMERO == tITULO.DOC_NUMERO && t.TITULOID != tITULO.TITULOID).Count() > 0)
                ModelState.AddModelError("DOC_NUMERO", "Este número já está sendo utilizado por este fornecedor!");

            
            if (ModelState.IsValid)
            {
                TITULO tit = db.TITULOes.Find(tITULO.TITULOID);
                tit.DOC_EMISSAO = tITULO.DOC_EMISSAO;
                tit.DOC_HISTORICO = tITULO.DOC_HISTORICO;
                tit.DOC_NATUREZA = tITULO.DOC_NATUREZA;
                tit.DOC_NUMERO = tITULO.DOC_NUMERO;
                tit.DOC_TIPO = tITULO.DOC_TIPO;
                tit.DOC_VALOR = tITULO.DOC_VALOR;
                tit.DOC_VENCIMENTO = tITULO.DOC_VENCIMENTO;
                tit.FORNECEDOR = tITULO.FORNECEDOR;
                db.Entry(tit).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            List<SelectListItem> tipo = new List<SelectListItem>();
            tipo.Add(new SelectListItem() { Text = "Sangria", Value = "1" });
            tipo.Add(new SelectListItem() { Text = "Título a pagar", Value = "2", Selected = (tITULO.DOC_TIPO == 2) });

            ViewBag.DOC_TIPO = tipo;

            List<NATUREZA> DOC_NATUREZA = db.Database.SqlQuery<NATUREZA>(System.Configuration.ConfigurationManager.AppSettings["QUERY_NATUREZA"]).ToList();
            ViewBag.DOC_NATUREZA = new SelectList(DOC_NATUREZA, "CODIGO", "DESCRICAO", tITULO.DOC_NATUREZA);
            ViewBag.FORNECEDOR = new SelectList(db.FORNECEDORs.Where(f => f.ATIVO == true).ToList(), "CODIGO", "NOME", tITULO.FORNECEDOR);

            return View(tITULO);
        }


        // GET: TITULOS/Delete/5
        [Authorize]
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            TITULO tITULO = db.TITULOes.Find(id);
            if (tITULO == null)
            {
                return HttpNotFound();
            }
            if (tITULO.LOGIN == null || !tITULO.LOGIN.Equals(User.Identity.Name) || !tITULO.STATUS.Equals(0))
            {
                return RedirectToAction("Index");
            }

            return View(tITULO);
        }

        // POST: TITULOS/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            TITULO tITULO = db.TITULOes.Find(id);
            db.TITULOes.Remove(tITULO);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        [HttpPost]
        public ActionResult GetFornecedores(string Natureza)
        {
            return Json(new SelectList(db.FORNECEDORs.Where(f => f.ATIVO == true && ( f.NATUREZA == Natureza || Natureza == "") ), "CODIGO", "NOME"),JsonRequestBehavior.AllowGet);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
